package main

import "fmt"

func main() {
	//if
	var a int = 3
	if a == 3 { //条件表达式没有括号
		fmt.Println("a==3")
	}
	//支持一个初始化表达式,初始化字句和条件表达式直接需要用分号分隔
	if b := 3; b == 3 {
		fmt.Println("b==3")
	}

	//拿登录密码做一个举例：
	var userpwd int = 123 //我自己定义的密码
	var upd int = 123     //假设用户自己输入的密码

	if userpwd == upd {
		fmt.Println("我密码正确了!!!!!我成功了")
		//反之如果不相等就不会进入花括号里面来，也就不会运行这里面的代码
	}
	//if … else
	if a := 3; a == 4 {
		fmt.Println("a==4")
	} else {
		//左大括号必须和条件语句或else在同一行
		fmt.Println("a!=4")
	}

	//拿登录密码做一个举例：
	var userpwd1 int = 123 //我自己定义的密码
	var upd1 int = 123456  //假设用户自己输入的密码

	if upd1 == userpwd1 {
		//上面这一行的意思（如果用户输入的密码等于了我自己设定的密码那就让他进来）
		//那么我就可以进入到这个花括号里面做点事情
		//比如打印

		fmt.Println("我密码正确了!!!!!我成功了")
		//反之如果不相等就不会进入花括号里面来，也就不会运行这里面的代码
	} else {
		//如果用户输入的密码和我定义的密码不一样，他就不会进入上面那个花括号
		//就会进入到我这里然后我就打印

		fmt.Println("就这？密码都是错的")

	}
	//switch
	//第一种写法
	//siii := 35
	//switch siii {
	//第二种写法
	switch siii := 30; siii {

	case 10:
		fmt.Println("10")
	case 20:
		fmt.Println("20")
		//表示强制向下执行
		fallthrough
	case 30, 40, 50:
		fmt.Println("30-50")
		//默认选项，当所有选项都不匹配的时候，选择这个
	default:
		fmt.Println(">50")

	}
	/*
		优点：
			if适合进行区间判断 多用于嵌套使用  执行效率低
			switch 执行效率高 可以将多个条件放在一起执行
		缺点：
			if执行效率低 不能将多个条件放在一起执行
	*/

	//循环
	sun := 0
	for ii := 1; ii <= 100; ii++ {
		sun = sun + ii
	}
	fmt.Println("sun=", sun)
	//关键字 range 会返回两个值，第一个返回值是元素的数组下标，第二个返回值是元素的值
	s := "abc"
	for i := range s { //支持string/array/slice/map。
		fmt.Printf("%c\n", s[i])
	}

	for _, c := range s { //忽略index
		fmt.Printf("%c\n", c)
	}

	for i, c := range s {
		fmt.Printf("%d,%c\n", i, c)
	}
	//在循环里面有两个关键操作break和continue，break操作是跳出当前循环，continue是跳过本次循环。

	for i := 0; i < 5; i++ {
		if 2 == i {
			//break操作是跳出当前循环
			continue //continue是跳过本次循环
			//goto 表示跳到指定位置
			goto xx
		}
		fmt.Println(i)
	xx:
		fmt.Println("跳出")
	}
	//break是跳出整个循环，剩下还没执行的循环也一并退出。

	//continue跳出当前循环，会跳过当前还没有执行完的剩余代码。但是剩余的循环还是会执行。

}
